#include <LCDWIKI_GUI.h> //Core graphics library
#include <LCDWIKI_SPI.h> //Hardware-specific library
#include <SoftwareSerial.h>
#define MODEL ILI9488_18
#define CS   8    
#define CD   10
#define RST  9
#define LED  -1  
//define some colour values
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define ORANGE  0x78E0
#define GREEN   0x07E0
#define LGREEN   0x17E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
LCDWIKI_SPI mylcd(MODEL,CS,CD,RST,LED); 
SoftwareSerial HC12_ser(3,4);
int recv_data,c=0;
char recv_char[3];
void draw_temp_block()
 {
   mylcd.Set_Text_Size(3); 
   mylcd.Set_Text_colour(GREEN);
   mylcd.Print_String("Temperature", 10, 5); 
   mylcd.Print_String("o",140,50); 
   mylcd.Set_Text_Size(8); 
   mylcd.Print_String("C",160,55);
   mylcd.Set_Draw_color(RED);
   mylcd.Fill_Circle(220,120,15);
   mylcd.Fill_Round_Rectangle(212,20,228,120,10);
   mylcd.Set_Draw_color(LGREEN);
   mylcd.Draw_Circle(220,120,15);
   mylcd.Draw_Round_Rectangle(212,20,228,120,10);
 }
void draw_humidity_block()
 {
   mylcd.Set_Text_Size(3); 
   mylcd.Set_Text_colour(CYAN);  
   mylcd.Print_String("Humidity", 275, 5);
   mylcd.Set_Text_Size(8); 
   mylcd.Print_String("%",370,55);  
   mylcd.Set_Draw_color(CYAN);
   mylcd.Fill_Circle(440,100,20);
   mylcd.Fill_Triangle(440,50,420,90,460,90);
 }
void draw_light_block()
 {
  mylcd.Set_Text_Size(3); 
  mylcd.Set_Text_colour(YELLOW);  
  mylcd.Print_String("Light", 50, 170); 
  mylcd.Set_Text_Size(8);
  mylcd.Print_String("%",120,210); 
  mylcd.Set_Draw_color(WHITE);
  mylcd.Fill_Circle(200,240,13);
  mylcd.Draw_Line(200,273,200,207);  
  mylcd.Draw_Line(167,240,233,240); 
  mylcd.Draw_Line(177,217,223,263);  
  mylcd.Draw_Line(177,263,223,217);  
  mylcd.Set_Draw_color(YELLOW);
  mylcd.Draw_Circle(200,240,13);
  mylcd.Draw_Circle(200,240,14);
  mylcd.Draw_Circle(200,240,15);
  mylcd.Draw_Circle(200,240,16);
  mylcd.Set_Draw_color(BLACK);
  mylcd.Draw_Circle(200,240,17);
  mylcd.Draw_Circle(200,240,18);
  mylcd.Draw_Circle(200,240,19);
  mylcd.Draw_Circle(200,240,20);
 }
void draw_moisture_block()
 {
  mylcd.Set_Text_Size(3); 
  mylcd.Set_Text_colour(MAGENTA);  
  mylcd.Print_String("Soil Moisture", 245, 170);
  mylcd.Set_Text_Size(8); 
  mylcd.Print_String("%",360,230); 
  mylcd.Set_Draw_color(ORANGE);
  mylcd.Draw_Line(410,235,470,235); 
  mylcd.Draw_Line(410,245,470,245); 
  mylcd.Draw_Line(410,255,470,255); 
  mylcd.Draw_Line(410,265,470,265); 
  mylcd.Draw_Line(410,275,470,275); 
  mylcd.Draw_Line(410,285,470,285);
  mylcd.Set_Draw_color(BLUE); 
  mylcd.Fill_Circle(440,280,15);  
  mylcd.Fill_Triangle(440,240,425,270,455,270); 
 }
void setup() 
{
  mylcd.Init_LCD();
  mylcd.Fill_Screen(BLACK);
  mylcd.Set_Text_Mode(0);   
  mylcd.Set_Rotation(1);
  mylcd.Set_Draw_color(YELLOW);
  mylcd.Draw_Line(240,2,240,318);  
  mylcd.Draw_Line(2,160,478,160);  
  mylcd.Set_Text_Back_colour(BLACK);  
  draw_temp_block();
  draw_humidity_block();
  draw_light_block();
  draw_moisture_block();
  HC12_ser.begin(9600);
  Serial.begin(9600);
  mylcd.Set_Text_Size(8); 
}

void loop() 
{
  char ch;
  while(HC12_ser.available())
      {
        if(HC12_ser.available()>0) ch = HC12_ser.read();
        if(ch == 't') 
         {
          recv_data = (recv_char[0]-48)*10  + (recv_char[1]-48);
          Serial.print("Temperature:");
          Serial.print(recv_data); 
          Serial.println("C");
          mylcd.Set_Text_colour(YELLOW);  
          mylcd.Print_Number_Int(recv_data,10,55,2,' ',10);          
          c=0;
         }
        else if(ch == 'h') 
         {
          recv_data = (recv_char[0]-48)*10  + (recv_char[1]-48);
          Serial.print("Humidity:");
          Serial.print(recv_data); 
          Serial.println("% RH"); 
          mylcd.Set_Text_colour(BLUE);  
          mylcd.Print_Number_Int(recv_data,250,55,2,' ',10);           
          c=0;
         } 
        else if(ch == 'l') 
         {
          recv_data = (recv_char[0]-48)*10  + (recv_char[1]-48);
          Serial.print("light intensity level:");
          Serial.print(recv_data);
          Serial.println('%'); 
          mylcd.Set_Text_colour(GREEN);  
          mylcd.Print_Number_Int(recv_data,10,210,2,' ',10);           
          c=0;
         }
        else if(ch == 's') 
         {
          recv_data = (recv_char[0]-48)*10  + (recv_char[1]-48);
          Serial.print("soil moisture level:");
          Serial.print(recv_data);
          Serial.println('%');  
          mylcd.Set_Text_colour(CYAN);  
          mylcd.Print_Number_Int(recv_data,250,230,2,' ',10);           
          c=0;
         } 
        else 
          {
            recv_char[c] = ch;
            c++;
          }
      }
}